/**
定一个数组 nums 和滑动窗口的大小 k，请找出所有滑动窗口里的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7] 
解释: 

  滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7
 

提示：

你可以假设 k 总是有效的，在输入数组不为空的情况下，1 ≤ k ≤ 输入数组的大小。

注意：本题与主站 239 题相同：https://leetcode-

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func maxSlidingWindow(nums []int, k int) []int {
	if len(nums) <= 0 {
		return nil
	}
	var (
		windows []int
		res     []int
	)
	//遍历数组
	for i, v := range nums {
		//i-k = 当窗口满时的最小下标
		//i-k >= 窗口最左边的数，则代表窗口已经满了
		if i >= k && windows[0] <= i-k {
			windows = windows[1:]
		}

		for {
			//如果窗口最后一个小于v，则去掉。为了维护了每次窗口最左边值最大
			if len(windows) > 0 && nums[windows[len(windows)-1]] <= v {
				windows = windows[:len(windows)-1]
			} else {
				break
			}
		}

		windows = append(windows, i)

		if i >= k-1 {
			res = append(res, nums[windows[0]])
		}
	}

	return res
}
